#include "stm32f10x.h"                  // Device header
#include "MyFlash.h"
#include "Store.h"


// 使用 SRAM 缓存数组来管理 FLASH 最后一页, 实现参数的任意读写和保存
// 需要备份的时候再统一转存到闪存里面.

// 1K 正好对应闪存的一页
uint16_t Store_Data[STORE_COUNT];


/**
  * @brief  初始化闪存, 即调用此函数将闪存最后一页数据加载到缓存
	*
  */
void Store_Init(void)
{
	// 1. 将闪存最后一页的第一半字当作标志位, 判断参数表是否是第一次使用
	if(MyFLASH_ReadHalfWord(STORE_START_ADDRESS) != 0xA5A5)
	{
		// 擦除页面
		MyFLASH_ErasePage(STORE_START_ADDRESS);
		
		// 写入标记, 表示 Flash 已经初始化
		MyFLASH_ProgramHalfWord(STORE_START_ADDRESS, 0xA5A5);
		
		// 将内部空间全部置为默认值0
		for(int i = 1; i < STORE_COUNT; i++)
		{
			MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, 0x0000);
		}
	}
	
	// 2. 上电的时候将数据全部写入到 SRAM 缓存中
	for(int i = 0; i < STORE_COUNT; i++)
	{
		Store_Data[i] = MyFLASH_ReadHalfWord(STORE_START_ADDRESS + i * 2);
	}	
}


/**
  * @brief  备份保存 1K SRAM 到 Flash 的最后一页
	*
  */
void Store_Save(void)
{
	// 1. 擦除最后一页
	MyFLASH_ErasePage(STORE_START_ADDRESS);
	
	// 2. 写入
	for(int i = 1; i < STORE_COUNT; i++)
	{
		MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2, Store_Data[i]);
	}
}


/**
  * @brief 将最后一页 Flash 数据清 0 
	*
  */
void Store_Clear(void)
{
	for(int i = 1; i < STORE_COUNT; i++)
	{
			Store_Data[i] = 0x0000;
	}
	Store_Save();
}